package com.rdgzs.jkmj.cmtdlrm.dao;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.jinku.datalayer.services.impl.GeneralBaseServicesImpl;
import com.jinku.framework.util.Pagination;
import com.rdgzs.jkmj.cmtdlrm.model.BaseAreaInfo;
import com.jinku.framework.util.home.UtilsObject;
import com.jinku.home.constants.BizConstants;
import com.jinku.framework.mcode.utils.ConstrantCode;
import com.jinku.datalayer.bean.ProjectInfoImpl;

/**
* ###################################################
* @创建日期：2014-3-3 12:01:15
* @开发人员：李广彬
* @功能描述：
* @修改日志：splitId 分库标准【一般是当前用户】
* ###################################################
*/
@Repository
public abstract  class BaseDaoImpl<T,PK> implements IBaseDao<T,PK> {
	private static final Log logger = LogFactory.getLog(BaseDaoImpl.class);
	@Autowired
	private SqlSessionTemplate sqlSession;
	/**
	* @创建日期：2014-3-3 12:01:15
	* @开发人员：李广彬
	* @功能描述：
	* @传入参数：
	*/
	public T get(PK id){
		return (T)query("id", id).get(0);
	}
	
	/**
	* @创建日期：2014-3-3 12:01:15
	* @开发人员：李广彬
	* @功能描述：
	* @传入参数：
	*/
	public List<T> query(String columnVar,Object val){
		Map params=new HashMap();
		params.put(columnVar,val);
		return sqlSession.selectList(getNamespace()+".query", params);
	}
	
	/**
	* @创建日期：2014-3-3 12:01:15
	* @开发人员：李广彬
	* @功能描述：
	* @传入参数：
	*/
	public List<T> query(String columnVar,Object val,String orderBy,String order){
		Map params=new HashMap();
		params.put(columnVar,val);
		params.put("orderBy",orderBy);
		params.put("order",order);
		return sqlSession.selectList(getNamespace()+".query", params);
	}
	
	/**
	* @创建日期：2014-3-3 12:01:15
	* @开发人员：李广彬
	* @功能描述：
	* @传入参数：
	*/
	public List<T> query(T entity)  throws Exception{
		Map params=UtilsObject.obj2map(entity);
		return sqlSession.selectList(getNamespace()+".query", params);
	}
	
	/**
	* @创建日期：2014-3-3 12:01:15
	* @开发人员：李广彬
	* @功能描述：
	* @传入参数：
	*/
	public List<T> query(T entity,String orderBy,String order)  throws Exception{
		Map params=UtilsObject.obj2map(entity);
		params.put("orderBy",orderBy);
		params.put("order",order);
		return sqlSession.selectList(getNamespace()+".query", params);
	}
	
	/**
	* @创建日期：2014-3-3 12:01:15
	* @开发人员：李广彬
	* @功能描述：
	* @传入参数：
	*/
	public Pagination query(Pagination page,T entity) throws Exception{
		Map params=UtilsObject.obj2map(entity);
		params.put("orderBy",page.getOrderBy());
		params.put("order",page.getOrder());
		params.put("start", page.getPageStart());
        params.put("end", page.getPageSize());
        params.putAll(page.queryOtherParam());
        List items=sqlSession.selectList(getNamespace()+".query", params);
        Integer total=count(entity);
        
        page.setItems(items);
        page.setTotalRecord(total);
		return page;
	}
	
	/**
	* @创建日期：2014-3-3 12:01:15
	* @开发人员：李广彬
	* @功能描述：
	* @传入参数：
	*/
	public <PK> PK save(T entity){
		entity.setCreateTime(new Date());
		return (Long)sqlSession.insert(getNamespace()+".insert", entity);
	}
	
	/**
	* @创建日期：2014-3-3 12:01:15
	* @开发人员：李广彬
	* @功能描述：
	* @传入参数：
	*/
	public <PK> PK save(List<T> entityList){
		for(T entity:entityList){
			entity.setCreateTime(new Date());
		}
		return (Long)sqlSession.insert(getNamespace()+".insertBatch", entityList);
	}
	
	/**
	* @创建日期：2014-3-3 12:01:15
	* @开发人员：李广彬
	* @功能描述：
	* @传入参数：
	*/
	public <PK> PK saveUpdate(T entity) throws Exception{
		Long result=null;
		Long id=entity.getId();
		if(id==null){
			result=this.save(entity);
		}else{
			result=new Long(this.update(entity));
		}
		return result;
	}
	
	/**
	* @创建日期：2014-3-3 12:01:15
	* @开发人员：李广彬
	* @功能描述：
	* @传入参数：
	*/
	public Integer update(T v_entity,T w_entity) throws Exception{
		Map params=new HashMap();
		Map values=UtilsObject.obj2map(v_entity,"v_");
		Map wheres=UtilsObject.obj2map(w_entity);
		params.putAll(values);
		params.putAll(wheres);
		return sqlSession.update(getNamespace()+".update", params);
	}
	
	/**
	* @创建日期：2014-3-3 12:01:15
	* @开发人员：李广彬
	* @功能描述：
	* @传入参数：
	*/
	public Integer update(T entity) throws Exception{
		if(entity.getId()==null){
			throw new Exception("单条更新  缺少必要的主键！");
		}
		Map params=UtilsObject.obj2map(entity,"v_");
		params.put("id",entity.getId());
		return sqlSession.update(getNamespace()+".update", params);
	}
	
	/**
	* @创建日期：2014-3-3 12:01:15
	* @开发人员：李广彬
	* @功能描述：
	* @传入参数：
	*/
	public Integer delete(PK id){
		return (Integer)sqlSession.delete(getNamespace()+".deleteLogic", id);
	}
	
	/**
	* @创建日期：2014-3-3 12:01:15
	* @开发人员：李广彬
	* @功能描述：
	* @传入参数：
	*/
	public Integer delete(T entity){
		return (Integer)sqlSession.delete(getNamespace()+".deleteLogicBatch", entity);
	}
	
	/**
	* @创建日期：2014-3-3 12:01:15
	* @开发人员：李广彬
	* @功能描述：
	* @传入参数：
	*/
	public Integer count(T entity) throws Exception{
		Map params=UtilsObject.obj2map(entity);
		return (Integer)sqlSession.queryForObject(getNamespace()+".query_count", params);
	}
	
	
	public abstract String getNamespace();


}


